﻿using System;
using System.Collections.Generic;
using System.Windows.Forms;
using Microsoft.Win32;
using SoftwareConsulting.BI11.Studio.InternalServices;
using SoftwareConsulting.BI11.Studio.UI.ProjectExplorer.SituationsHierarchy;

[assembly:CLSCompliant(true)]
namespace SoftwareConsulting.BI11.Studio.UI
{
    /// <summary>
    /// Класс настроек программы
    /// </summary>    
    public sealed class Settings
    {        
        #region внутренние переменные        
        private ColorScheme _scheme;//текущая цветовая схема оформления иерархии ситуаций
        private PanelsStyle _style;//текущее оформление панелей
        private bool _autoopen;//флаг режима автооткрытия последнего файла
        private double _discriminantAnalysisMaxError; //максимально допустимая ошибка дискриминантного анализа
        private bool _autohideObjectsGroups;//флаг автоскрытия панели выбора отображаемых объектов в обозревателе проектов
        private bool _blocking;//флаг возможности блокировки характеристик при удалении связи
        private bool _playsounds;//флаг режима проигрывания звуков
        private string _lastProjectPathAndName;//путь к последнему открытому проекту
        private ViewType _projectExplorerView; //вид отображения объектов в обозревателе проекта
        private bool _simpleMode; //флаг режима новичка
        private int _projectExplorerObjectsGroupsWidth; //ширина панели выбора отображаемых объектов в обозревателе проекта
        private int _projectExplorerObjectPropertiesWidth; //ширина области свойств объекта в обозревателе проекта
        private List<int> _projectExplorerColumnsWidth; //ширина колонок в обозревателе проекта        
        private int _projectExplorerObjectsGroupsPageIndex; //индекс выбранной страницы панели выбора отображаемых объектов в обозревателе проекта
        private int _projectExplorerObjectsKindsSelectedIndex; //индекс выбранного вида объектов на панели выбора отображаемых объектов в обозревателе проекта
        private bool _projectExplorerObjectsTreeEnabled; //флаг отображения содержимого выбранной папки в обозревателе проекта        
        #endregion

        #region публичные свойства
        /// <summary>
        /// Возвращает/устанавливает текущую цветовую схему иерархии ситуаций
        /// </summary>        
        public ColorScheme Scheme
        {
            get
            {                
                return _scheme;
            }
            set
            {
                _scheme = value;
            }
        }

        /// <summary>
        /// Возвращает/устанавливает текущее оформление панелей
        /// </summary>
        public PanelsStyle Style
        {
            get
            {
                return _style;
            }
            set
            {
                value = value == PanelsStyle.None ? PanelsStyle.Caramel : value;
                _style = value;                 
            }
        }

        /// <summary>
        /// Возвращает/устанавливает флаг режима автооткрытия последнего файла
        /// </summary>        
        public bool Autoopen
        {
            get
            {
                return _autoopen;
            }
            set
            {
                _autoopen = value;
            }
        }

        /// <summary>
        /// Возвращает/устанавливает флаг возможности блокировки характеристик при удалении связи
        /// </summary>        
        public bool CharacteristicsBlockingAbility
        {
            get
            {
                return _blocking;
            }
            set
            {
                _blocking = value;
            }
        }
        
        /// <summary>
        /// Возвращает/устанавливает максимально допустимую ошибку дискриминантного анализа
        /// </summary>
        public double DiscriminantAnalysisMaxError
        {
            get
            {
                return _discriminantAnalysisMaxError;
            }
            set
            {
                _discriminantAnalysisMaxError = value;
            }
        }

        /// <summary>
        /// Возвращает/устанавливает флаг автоскрытия панели выбора отображаемых объектов в обозревателе проектов
        /// </summary>
        public bool AutohideObjectsGroups
        {
            get
            {
                return _autohideObjectsGroups;
            }
            set
            {
                _autohideObjectsGroups = value;
            }
        }

        /// <summary>
        /// Возвращает/устанавливает флаг проигрывания звуков
        /// </summary>        
        public bool PlaySounds
        {
            get
            {
                return _playsounds;
            }
            set
            {
                _playsounds = value;
            }
        }

        /// <summary>
        /// Возвращает/устанавливает путь к последнему открытому проекту
        /// </summary>        
        public string LastProjectPathAndName
        {
            get
            {
                return _lastProjectPathAndName;
            }
            set
            {
                _lastProjectPathAndName = value;
            }
        }

        /// <summary>
        /// Возвращает/устанавливает вид отображения объектов в обозревателе проекта
        /// </summary>
        public ViewType ProjectExplorerView
        {
            get
            {
                return _projectExplorerView;
            }
            set
            {
                _projectExplorerView = value;
            }
        }

        /// <summary>
        /// Возвращает/устанавливает флаг режима новичка
        /// </summary>
        public bool SimpleMode
        {
            get
            {
                return _simpleMode;
            }
            set
            {
                _simpleMode = value;
            }
        }

        /// <summary>
        /// Возвращает/устанавливает ширину колонок в обозревателе проекта
        /// </summary>
        public List<int> ProjectExplorerColumnsWidth
        {
            get
            {
                return _projectExplorerColumnsWidth;
            }
            set
            {
                _projectExplorerColumnsWidth = value;
            }
        }

        

        /// <summary>
        /// Возвращает/устанавливает ширину панели выбора отображаемых объектов в обозревателе проекта
        /// </summary>
        public int ProjectExplorerObjectsGroupsWidth
        {
            get
            {
                return _projectExplorerObjectsGroupsWidth;
            }
            set
            {
                _projectExplorerObjectsGroupsWidth = value;
            }
        }

        /// <summary>
        /// Возвращает/устанавливает ширину области свойств объекта в обозревателе проекта
        /// </summary>
        public int ProjectExplorerObjectPropertiesWidth
        {
            get
            {
                return _projectExplorerObjectPropertiesWidth;
            }
            set
            {
                _projectExplorerObjectPropertiesWidth = value;
            }
        }

        /// <summary>
        /// Возвращает/устанавливает индекс выбранной страницы панели выбора отображаемых объектов в обозревателе проекта
        /// </summary>
        public int ProjectExplorerObjectsGroupsPageIndex
        {
            get
            {
                return _projectExplorerObjectsGroupsPageIndex;
            }
            set
            {
                _projectExplorerObjectsGroupsPageIndex = value;
            }
        }

        /// <summary>
        /// Возвращает/устанавливает индекс выбранного вида объектов на панели выбора отображаемых объектов в обозревателе проекта
        /// </summary>
        public int ProjectExplorerObjectsKindsSelectedIndex
        {
            get
            {
                return _projectExplorerObjectsKindsSelectedIndex;
            }
            set
            {
                _projectExplorerObjectsKindsSelectedIndex = value;
            }
        }

        /// <summary>
        /// Возвращает/устанавливает флаг отображения содержимого выбранной папки в обозревателе проекта
        /// </summary>
        public bool ProjectExplorerObjectsTreeEnabled
        {
            get
            {
                return _projectExplorerObjectsTreeEnabled;
            }
            set
            {
                _projectExplorerObjectsTreeEnabled = value;
            }
        }        
        #endregion

        #region публичные методы       
        /// <summary>
        /// Сохранение настроек в реестре
        /// </summary>        
        public void SaveMe()
        {            
            RegistryKey saveKey = Registry.CurrentUser.CreateSubKey("Software\\SoftwareConsulting\\BI-11\\Autoopen");
            saveKey.SetValue("autoopen", Autoopen, RegistryValueKind.DWord);
            saveKey.SetValue("lastProject", LastProjectPathAndName, RegistryValueKind.String);            
            saveKey.Close();
            saveKey = Registry.CurrentUser.CreateSubKey("Software\\SoftwareConsulting\\BI-11\\General");
            saveKey.SetValue("simpleMode", SimpleMode, RegistryValueKind.DWord);
            saveKey.Close();            
            saveKey = Registry.CurrentUser.CreateSubKey("Software\\SoftwareConsulting\\BI-11\\ProjectExplorer");
            saveKey.SetValue("autohideObjectsGroups", AutohideObjectsGroups, RegistryValueKind.DWord);
            saveKey.SetValue("blockOnDelete", CharacteristicsBlockingAbility, RegistryValueKind.DWord);            
            saveKey.SetValue("scheme", Scheme, RegistryValueKind.DWord);
            saveKey.SetValue("style", Style, RegistryValueKind.DWord);
            saveKey.SetValue("sounds", PlaySounds, RegistryValueKind.DWord);
            saveKey.SetValue("view", ProjectExplorerView, RegistryValueKind.DWord);
            saveKey.SetValue("groupsWidth", ProjectExplorerObjectsGroupsWidth, RegistryValueKind.DWord);
            saveKey.SetValue("propertiesWidth", ProjectExplorerObjectPropertiesWidth, RegistryValueKind.DWord);
            saveKey.SetValue("columnsWidth", _projectExplorerColumnsWidth.ToStringWithDelimiters(';'), RegistryValueKind.String);
            saveKey.SetValue("objectsGroupsPage", ProjectExplorerObjectsGroupsPageIndex, RegistryValueKind.DWord);
            saveKey.SetValue("objectsKindsSelected", ProjectExplorerObjectsKindsSelectedIndex, RegistryValueKind.DWord);
            saveKey.SetValue("objectsTreeEnabled", ProjectExplorerObjectsTreeEnabled, RegistryValueKind.DWord);            
            saveKey.Close();
            saveKey = Registry.CurrentUser.CreateSubKey("Software\\SoftwareConsulting\\BI-11\\DiscriminantAnalysis");
            saveKey.SetValue("discriminantAnalysisMaxError", DiscriminantAnalysisMaxError, RegistryValueKind.DWord);
            saveKey.Close();
        }

        /// <summary>
        /// Восстановление настроек из реестра
        /// </summary>        
        public void RestoreMe()
        {
            object rec = null;
            RegistryKey readKey = Registry.CurrentUser.OpenSubKey("Software\\SoftwareConsulting\\BI-11\\Autoopen");
            if (readKey != null)
            {
                rec = readKey.GetValue("autoopen");
                if (rec != null)
                {
                    try
                    {
                        Autoopen = ((int)rec).ToBoolean();
                    }
                    catch (InvalidCastException ex)
                    {
                        Trace.StartBlock("Registry record reading failed");
                        Trace.Message(ex.Message + " " + rec.ToString());
                        Trace.EndBlock();
                    }
                }
                rec = readKey.GetValue("lastProject");
                if (rec != null)
                {
                    try
                    {
                        LastProjectPathAndName = (string)rec;
                    }
                    catch (InvalidCastException ex)
                    {
                        Trace.StartBlock("Registry record reading failed");
                        Trace.Message(ex.Message + " " + rec.ToString());
                        Trace.EndBlock();
                    }
                }
                readKey.Close();
            }
            readKey = Registry.CurrentUser.OpenSubKey("Software\\SoftwareConsulting\\BI-11\\General");
            if (readKey != null)
            {
                rec = readKey.GetValue("simpleMode");
                if (rec != null)
                {
                    try
                    {
                        SimpleMode = ((int)rec).ToBoolean();
                    }
                    catch (InvalidCastException ex)
                    {
                        Trace.StartBlock("Registry record reading failed");
                        Trace.Message(ex.Message + " " + rec.ToString());
                        Trace.EndBlock();
                    }
                }
                readKey.Close();
            }
            readKey = Registry.CurrentUser.OpenSubKey("Software\\SoftwareConsulting\\BI-11\\ProjectExplorer");
            if (readKey != null)
            {
                rec = readKey.GetValue("autohideObjectsGroups");
                if (rec != null)
                {
                    try
                    {
                        AutohideObjectsGroups = ((int)rec).ToBoolean();
                    }
                    catch (InvalidCastException ex)
                    {
                        Trace.StartBlock("Registry record reading failed");
                        Trace.Message(ex.Message + " " + rec.ToString());
                        Trace.EndBlock();
                    }
                }
                rec = readKey.GetValue("blockOnDelete");
                if (rec != null)
                {
                    try
                    {
                        CharacteristicsBlockingAbility = ((int)rec).ToBoolean();
                    }
                    catch (InvalidCastException ex)
                    {
                        Trace.StartBlock("Registry record reading failed");
                        Trace.Message(ex.Message + " " + rec.ToString());
                        Trace.EndBlock();
                    }
                }
                rec = readKey.GetValue("scheme");
                if (rec != null)
                {
                    try
                    {
                        Scheme = (ColorScheme)rec;
                    }
                    catch (InvalidCastException ex)
                    {
                        Trace.StartBlock("Registry record reading failed");
                        Trace.Message(ex.Message + " " + rec.ToString());
                        Trace.EndBlock();
                    }
                }
                rec = readKey.GetValue("style");
                if (rec != null)
                {
                    try
                    {
                        Style = (PanelsStyle)rec;
                    }
                    catch (InvalidCastException ex)
                    {
                        Trace.StartBlock("Registry record reading failed");
                        Trace.Message(ex.Message + " " + rec.ToString());
                        Trace.EndBlock();
                    }
                }
                rec = readKey.GetValue("sounds");
                if (rec != null)
                {
                    try
                    {
                        PlaySounds = ((int)rec).ToBoolean();
                    }
                    catch (InvalidCastException ex)
                    {
                        Trace.StartBlock("Registry record reading failed");
                        Trace.Message(ex.Message + " " + rec.ToString());
                        Trace.EndBlock();
                    }
                }
                rec = readKey.GetValue("view");
                if (rec != null)
                {
                    try
                    {
                        ProjectExplorerView = (ViewType)rec;
                    }
                    catch (InvalidCastException ex)
                    {
                        Trace.StartBlock("Registry record reading failed");
                        Trace.Message(ex.Message + " " + rec.ToString());
                        Trace.EndBlock();
                    }
                }
                rec = readKey.GetValue("groupsWidth");
                if (rec != null)
                {
                    try
                    {
                        ProjectExplorerObjectsGroupsWidth = (int)rec;
                    }
                    catch (InvalidCastException ex)
                    {
                        Trace.StartBlock("Registry record reading failed");
                        Trace.Message(ex.Message + " " + rec.ToString());
                        Trace.EndBlock();
                    }
                }
                rec = readKey.GetValue("propertiesWidth");
                if (rec != null)
                {
                    try
                    {
                        ProjectExplorerObjectPropertiesWidth = (int)rec;
                    }
                    catch (InvalidCastException ex)
                    {
                        Trace.StartBlock("Registry record reading failed");
                        Trace.Message(ex.Message + " " + rec.ToString());
                        Trace.EndBlock();
                    }
                }
                rec = readKey.GetValue("columnsWidth");
                if (rec != null)
                {
                    List<int> list = new List<int>();
                    try
                    {                        
                        string[] widths = (rec as string).Split(';');
                        for (int i = 0; i < widths.Length; i++)
                        {
                            list.Add(int.Parse(widths[i]));
                        }                        
                    }
                    catch (InvalidCastException ex)
                    {
                        Trace.StartBlock("Registry record reading failed");
                        Trace.Message(ex.Message + " " + rec.ToString());
                        Trace.EndBlock();
                    }
                    ProjectExplorerColumnsWidth = list;
                }
                rec = readKey.GetValue("objectsGroupsPage");
                if (rec != null)
                {
                    try
                    {
                        ProjectExplorerObjectsGroupsPageIndex = (int)rec;
                    }
                    catch (InvalidCastException ex)
                    {
                        Trace.StartBlock("Registry record reading failed");
                        Trace.Message(ex.Message + " " + rec.ToString());
                        Trace.EndBlock();
                    }
                }
                rec = readKey.GetValue("objectsKindsSelected");
                if (rec != null)
                {
                    try
                    {
                        ProjectExplorerObjectsKindsSelectedIndex = (int)rec;
                    }
                    catch (InvalidCastException ex)
                    {
                        Trace.StartBlock("Registry record reading failed");
                        Trace.Message(ex.Message + " " + rec.ToString());
                        Trace.EndBlock();
                    }
                }
                rec = readKey.GetValue("objectsTreeEnabled");
                if (rec != null)
                {
                    try
                    {
                        ProjectExplorerObjectsTreeEnabled = ((int)rec).ToBoolean();
                    }
                    catch (InvalidCastException ex)
                    {
                        Trace.StartBlock("Registry record reading failed");
                        Trace.Message(ex.Message + " " + rec.ToString());
                        Trace.EndBlock();
                    }
                }                              
                readKey.Close();
            }
            readKey = Registry.CurrentUser.OpenSubKey("Software\\SoftwareConsulting\\BI-11\\DiscriminantAnalysis");
            if (readKey != null)
            {
                rec = readKey.GetValue("discriminantAnalysisMaxError");
                if (rec != null)
                {
                    try
                    {
                        DiscriminantAnalysisMaxError = (double)rec;
                    }
                    catch (InvalidCastException ex)
                    {
                        Trace.StartBlock("Registry record reading failed");
                        Trace.Message(ex.Message + " " + rec.ToString());
                        Trace.EndBlock();
                    }
                }
                readKey.Close();
            }
        }
        #endregion        

        #region конструкторы и финализаторы
        /// <summary>
        /// Конструктор класса
        /// </summary>
        public Settings()
        {            
            _scheme = ColorScheme.System;
            _style = PanelsStyle.Caramel;
            _autoopen = true;
            _autohideObjectsGroups = true;
            _blocking = true;
            _playsounds = true;
            _lastProjectPathAndName = "";
            _simpleMode = true;
            _discriminantAnalysisMaxError = 0.2;
            _projectExplorerView = ViewType.Full;
            _projectExplorerObjectsGroupsWidth = 320;
            _projectExplorerObjectPropertiesWidth = 300;
            _projectExplorerColumnsWidth = new List<int>();            
            _projectExplorerObjectsGroupsPageIndex = 0;
            _projectExplorerObjectsKindsSelectedIndex = 0;
            _projectExplorerObjectsTreeEnabled = true;            
        }               
        #endregion
    }
}
